/** 滑动窗口算法 */
/**
示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 
} 
 */

var lengthOfLongestSubstring = (s) => {
    let window = {};
    let left = 0, right = 0;
    let maxLen = 0;

    while(right < s.length) {
        let current = s[right];
        window[current] ? window[current]++ : window[current] = 1;
        right ++;

        // 窗口中有字符重复
        while(window[current] > 1) {
            let now = s[left];
            // 左边界右移，缩小窗口
            left++;
            window[now]--;
        }
        maxLen = Math.max(maxLen, right-left);
    }
    return maxLen;
}

console.log(lengthOfLongestSubstring('pwwkew'));
